#include<stdio.h>
#include<string.h>                                                              
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>

#define SERVERPORT 8001
#define BUFSIZE 1024

int main(int argc, char* argv[])
{
    // 创建套接字
    int lfd = socket(AF_INET,SOCK_STREAM,0);
    if(lfd == -1)
    {
        perror("socket error");
        exit(1);
    }

    struct sockaddr_in seraddr,cliaddr;
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(SERVERPORT);
    seraddr.sin_addr.s_addr = 0;
    // 绑定IP和端口
    bind(lfd,(struct sockaddr*)&seraddr,sizeof(seraddr));
    // 主动套接字转被动套接字
    listen(lfd,64);
    printf("等待客户端建立连接\n");
    
    while(1)
    {
        int caddrlen = sizeof(cliaddr);
        int cfd = accept(lfd,(struct sockaddr*)&cliaddr,&caddrlen);
        if(cfd == -1)
        {
            perror("accept error");
            exit(1);
        }
        // 取出客户端端口号
        int port = ntohs(cliaddr.sin_port);
        // 取出客户端ip
        char dst[64];
        inet_ntop(AF_INET,&cliaddr.sin_addr.s_addr,dst,sizeof(dst));
        printf("客户端%s 建立连接,端口号为：%d\n",dst,port);

        int pid = fork();
        if(pid == 0)
        {
            close(lfd); 
            char buf[BUFSIZE];
            int ret;
            while(1)
            {
                ret = read(cfd,buf,BUFSIZE);
                write(STDOUT_FILENO,buf,ret);
                write(cfd,buf,ret);
            }
        }
        close(cfd);
    }
    return 0;
}


